From caaaad749ab5e81c3c90043b6112b290e41e972b Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 23 Jun 2010 17:04:26 +0100 Subject: [PATCH] libxl: make libxl_wait_for_device_model clearer at the moment libxl_wait_for_device_model waits on a xenstore watch before checking the current value of the xenstore node, that might contain already the value the function was looking for. This patch changes libxl_wait_for_device_model so that it checks the value of the xenstore node first, then waits for the watch. xenstore watch automatically fire one time when you install them for this exact same purpose, so the previous code is not wrong, but this version is clearer. Signed-off-by: Stefano Stabellini --- tools/libxl/libxl_device.c | 39 +++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 090303b746..13563e89d9 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -418,7 +418,7 @@ int libxl_wait_for_device_model(struct libxl_ctx *ctx, char *path; char *p; unsigned int len; - int rc; + int rc = 0; struct xs_handle *xsh; int nfds; fd_set rfds; @@ -432,28 +432,29 @@ int libxl_wait_for_device_model(struct libxl_ctx *ctx, tv.tv_sec = LIBXL_DEVICE_MODEL_START_TIMEOUT; tv.tv_usec = 0; nfds = xs_fileno(xsh) + 1; - while (tv.tv_sec > 0) { + while (rc > 0 || (!rc && tv.tv_sec > 0)) { + p = xs_read(xsh, XBT_NULL, path, &len); + if (p && (!state || !strcmp(state, p))) { + free(p); + xs_unwatch(xsh, path, path); + xs_daemon_close(xsh); + if (check_callback) { + rc = check_callback(ctx, check_callback_userdata); + if (rc) return rc; + } + return 0; + } + free(p); +again: FD_ZERO(&rfds); FD_SET(xs_fileno(xsh), &rfds); - if (select(nfds, &rfds, NULL, NULL, &tv) > 0) { + rc = select(nfds, &rfds, NULL, NULL, &tv); + if (rc > 0) { l = xs_read_watch(xsh, &num); - if (l != NULL) { + if (l != NULL) free(l); - p = xs_read(xsh, XBT_NULL, path, &len); - if (!p) - continue; - if (!state || !strcmp(state, p)) { - free(p); - xs_unwatch(xsh, path, path); - xs_daemon_close(xsh); - if (check_callback) { - rc = check_callback(ctx, check_callback_userdata); - if (rc) return rc; - } - return 0; - } - free(p); - } + else + goto again; } } xs_unwatch(xsh, path, path); -- 2.30.2